package com.dxf.chepter05

/**
 * 基本介绍
 * 1抽象类是 scala 中 通过abstract 关键字标记不能被实例化的类
 *
 * 2 方法不用标记abstract,只要省略方法体即可
 *
 * 3 抽象类可以拥有抽象字段,没有初始值的字段
 *
 *
 * 作用:
 * 抽象类作用在于设计,规范
 *
 *
 * 细节:
 * 1 在抽象类中可以有实现方法
 * 2 默认情况下一个抽象类不能实例化,但是实例化时可以动态实现抽象类的所有方法
 * 3 一旦类包含抽象方法或者抽象属性,类必须声明为abstract
 * 4 抽象方法不能有主体,不允许使用abstract修饰
 * 5 如果一个类继承抽象类,则该类是抽象类或者实现所有的抽象方法和属性
 * 6 抽象方法和抽象属性不能用private和final来修饰,这些关键字都是和重写和实现相违背的
 * 7 抽象类中可以实现方法
 * 8 子类重写抽象方法不需要override ,写上也不会错
 *
 */
object T60_抽象类 {
  def main(args: Array[String]): Unit = {
    println("xx")

    val animal2 = new Animal02 {
      override def sayHello(): Unit = {
        println("11")
      }
    }


    val mouster = new Mouster()
    println(mouster.name)
  }

}


abstract class Animal01 {
  var name: String
  var age: Int
  var color: String = "black"

  //方法不用标记abstract,只要省略方法体即可
  //标记后报错 Error:(27, 16) `abstract' modifier can be used only for classes; it should be omitted for abstract members  abstract def cry()
  /*abstract*/ def cry()
}

abstract class Animal02 {
  def sayHello()
}

class Mouster extends Animal01 {
  var name: String = _
  var age: Int = _

  def cry(): Unit = {
    1
  }
}